package Task3_Threading;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class SalesApp {

    // 定义优惠券的数量
    private static final int TOTAL_COUPONS = 10;

    public static void main(String[] args) throws Exception{
        System.out.println("====== 活动开始，共有" + TOTAL_COUPONS + "张优惠券 ======");
        // 模拟多个顾客抢购优惠券

        // 初始化优惠券数量
        SalesCallable.initCoupons(TOTAL_COUPONS);

        // 通过线程池模拟多个顾客
        // ExecutorService executor = Executors.newCachedThreadPool();
        ExecutorService executor = new ThreadPoolExecutor(
            2, //线程池大小
            4,  // 最大线程池大小
            1,  // 线程空闲时间
            TimeUnit.SECONDS,  // 线程空闲时间单位
            new ArrayBlockingQueue<>(1), // 任务队列
            Executors.defaultThreadFactory(),  // 线程工厂
            new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
        );

        // 多个顾客抢购结果放入Future中
        List<Future<Boolean>> futures = new ArrayList<>();
        // 创建多个顾客， 需要不同的顾客ID
        AtomicInteger customerId = new AtomicInteger(0);

        // 模拟多个顾客
        boolean flag = true;//还有优惠券
        while(flag){
            try{
                String customerName = "顾客" + customerId.incrementAndGet();
                // 创建一个新的顾客
                Future<Boolean> future = executor.submit(new SalesCallable(customerName));
                futures.add(future);
                // 判断当前顾客操作是否完成
                if(future.isDone()){
                    flag = future.get();// 返回操作的结果
                }
            }catch(Exception e){
                // 处理无法计算的异常
                System.out.println("当前排队的人数过多，请稍候再试");
                Thread.sleep(50);
            }

        }

         // 关闭线程池
         executor.shutdown();
         // 优雅方式：等待一会，再关闭
         try{
            if(!executor.awaitTermination(1, TimeUnit.MINUTES)){
                executor.shutdownNow();
            }
         }catch(Exception e){
             executor.shutdownNow();
         }


        System.out.println("====== 活动结束，所有优惠券已抢完 ======");
    }
}

